#pragma once

#include <list>

#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>
#include <boost/program_options.hpp>

#include <boost/guid.hpp>

using boost::asio::ip::tcp;
namespace po = boost::program_options;

namespace cm {

	typedef std::list<std::string> strings;
	typedef std::list<boost::guid> ids;

namespace client_server {

	// -- Questi tipi vengono passati tra server e client e viceversa --

	// Attenzione: per quanto riguarda le dimensioni dei tipo la piattaforma di riferimento e Win32
	// Attenzione: per quanto riguarda la rappresentazione big-endian e little-endian la piattaforma di riferimento e Win32 (Utilizzare cose simili a htons)

	typedef unsigned long  size_t;
	enum size_t_size {size_t_size			= sizeof(cm::client_server::size_t)};

	typedef unsigned short str_len;
	enum str_len_size {str_len_size			= sizeof(str_len)};

	typedef unsigned long session_id; 
	enum session_id_size {session_id_size	= sizeof(session_id)};

	typedef unsigned long file_len;
	enum file_len_size {file_len_size		= sizeof(file_len)};

	typedef unsigned long version_age;
	enum version_age_size {version_age_size = sizeof(version_age)};

	//--------------------------------------------

	enum server_session_id {server_session_id	= 1};

	//--------------------------------------------

	typedef boost::shared_ptr<boost::asio::streambuf>	streambuf_ptr;

}}
